﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Grafica.ClienteWS;

namespace Grafica
{
    public partial class Boleta : Form
    {
        private static Boleta InstanciaFormulario = null;
        public DataCoche[] coches;
        private DataBoleta boleta;

         public Boleta()
        {    
            InitializeComponent();
            CargarGastosDisponibles();
            CargarEmpleados();
            CargarCoches();
            buttonModify.Enabled = false;
        }

         public Boleta(bool modificar, DataBoleta boleta)
         {
             InitializeComponent();
             this.Text = "Modificar boleta";
             CargarGastosDisponibles();
             CargarEmpleados();
             CargarCoches();
             buttonModify.Enabled = modificar;
             buttonAdd.Enabled = !modificar;
             this.boleta = boleta;
             CargarDatosBoleta(boleta);
         }

         public static Boleta Instance()
        {
            if (InstanciaFormulario == null)
            {
                InstanciaFormulario = new Boleta();
            }
            return InstanciaFormulario;
        }


         public static Boleta Instance(bool modificar, DataBoleta boleta)
         {
             if (InstanciaFormulario == null)
             {
                 InstanciaFormulario = new Boleta(modificar, boleta);
             }
             return InstanciaFormulario;
         }

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);

            InstanciaFormulario = null;
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void button4_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void buttonAdd_Click(object sender, EventArgs e)
        {
            #region validacionCampos
            if (String.IsNullOrEmpty(comboBoxEmpleado.Text))
            {
                errorProvider1.SetError(comboBoxEmpleado, "Seleccione el empleado.");
            }
            else
            {
                errorProvider1.SetError(comboBoxEmpleado, String.Empty);
            }
            if (String.IsNullOrEmpty(textBoxCantHoras.Text))
            {
                errorProvider1.SetError(textBoxCantHoras, "Ingrese la cantidad de horas.");
            }
            else
            {
                errorProvider1.SetError(textBoxCantHoras, String.Empty);
            }

            if (String.IsNullOrEmpty(comboBoxCoche.Text))
            {
                errorProvider1.SetError(comboBoxCoche, "Seleccione el coche.");
            }
            else
            {
                errorProvider1.SetError(comboBoxCoche, String.Empty);
            }

            if (String.IsNullOrEmpty(textBoxKmsCocheActual.Text))
            {
                errorProvider1.SetError(textBoxKmsCocheActual, "Ingrese el kilometraje actual del coche.");
            }
            else
            {
                if (Convert.ToInt32(textBoxKmsCocheActual.Text) < Convert.ToInt32(textBoxKmsCocheAntes.Text))
                {
                    errorProvider1.SetError(textBoxKmsCocheActual, "Los kilometros de llegada deben ser mayor a los de inicio.");
                }
                else
                {
                   errorProvider1.SetError(textBoxKmsCocheActual, String.Empty);
                }
            }

            if (String.IsNullOrEmpty(textBoxImporte.Text))
            {
                errorProvider1.SetError(textBoxImporte, "Ingrese el importe de la boleta.");
            }
            else
            {
                errorProvider1.SetError(textBoxImporte, String.Empty);
            }

            #endregion

            if (!String.IsNullOrEmpty(comboBoxEmpleado.Text) && !String.IsNullOrEmpty(textBoxCantHoras.Text) && !String.IsNullOrEmpty(comboBoxCoche.Text)
                && !String.IsNullOrEmpty(textBoxKmsCocheActual.Text) && !String.IsNullOrEmpty(textBoxImporte.Text)
                && Convert.ToInt32(textBoxKmsCocheActual.Text) > Convert.ToInt32(textBoxKmsCocheAntes.Text))
            {
                EtaxiSoapClient ws = new EtaxiSoapClient();

                DataBoleta boleta = new DataBoleta();
                boleta.FecJornal = dateTimePicker1.Value;
                // preguntar primero si hay empleados
                boleta.CedulaEmpleado = comboBoxEmpleado.SelectedItem.ToString();
                boleta.HsTrabajadas = Convert.ToInt32(textBoxCantHoras.Text);
                boleta.Matricula = comboBoxCoche.SelectedItem.ToString();
                boleta.KmEntrada = Convert.ToInt32(textBoxKmsCocheAntes.Text);
                boleta.KmSalida = Convert.ToInt32(textBoxKmsCocheActual.Text);
                boleta.Importe = Convert.ToInt32(textBoxImporte.Text);
                if (checkBoxDeposito.Checked)
                    boleta.EsDepositoBancario = true;
                else
                    boleta.EsDepositoBancario = false;
                boleta.Observaciones = textBoxObservaciones.Text;
                boleta.Estado = "abierto";

                int i = 0;
                ws.InicializarGastosBoletas();
                foreach (string gasto in listBoxGastosDeLaBoleta.Items)
                {
                    DataGasto nuevoGasto = new DataGasto();
                    nuevoGasto.Nombre = gasto;
                    nuevoGasto.Monto =  Convert.ToInt32(listBoxGastoImporte.Items[i]);
                    ws.AgregarGastoBoleta(nuevoGasto);
                    i++;
                }

                if(!ws.AltaBoleta(boleta)){
                    MessageBox.Show("No se ha podido agregar la boleta", "Error al agregar boleta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
                else
                {
                    MessageBox.Show("Se ha agregado la boleta", "Boleta agregada correctamente", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                    Dispose();
                }
            }
        }

        private void buttonModify_Click(object sender, EventArgs e)
        {
            #region validacionCampos
            if (String.IsNullOrEmpty(comboBoxEmpleado.Text))
            {
                errorProvider1.SetError(comboBoxEmpleado, "Seleccione el empleado.");
            }
            else
            {
                errorProvider1.SetError(comboBoxEmpleado, String.Empty);
            }
            if (String.IsNullOrEmpty(textBoxCantHoras.Text))
            {
                errorProvider1.SetError(textBoxCantHoras, "Ingrese la cantidad de horas.");
            }
            else
            {
                errorProvider1.SetError(textBoxCantHoras, String.Empty);
            }

            if (String.IsNullOrEmpty(comboBoxCoche.Text))
            {
                errorProvider1.SetError(comboBoxCoche, "Seleccione el coche.");
            }
            else
            {
                errorProvider1.SetError(comboBoxCoche, String.Empty);
            }

            if (String.IsNullOrEmpty(textBoxKmsCocheActual.Text))
            {
                errorProvider1.SetError(textBoxKmsCocheActual, "Ingrese el kilometraje actual del coche.");
            }
            else
            {
                errorProvider1.SetError(textBoxKmsCocheActual, String.Empty);
            }

            if (String.IsNullOrEmpty(textBoxImporte.Text))
            {
                errorProvider1.SetError(textBoxImporte, "Ingrese el importe de la boleta.");
            }
            else
            {
                errorProvider1.SetError(textBoxImporte, String.Empty);
            }
            #endregion

            if (!String.IsNullOrEmpty(comboBoxEmpleado.Text) && !String.IsNullOrEmpty(textBoxCantHoras.Text) && !String.IsNullOrEmpty(comboBoxCoche.Text)
                && !String.IsNullOrEmpty(textBoxKmsCocheActual.Text) && !String.IsNullOrEmpty(textBoxImporte.Text))
            {
                EtaxiSoapClient ws = new EtaxiSoapClient();

                boleta.FecJornal = dateTimePicker1.Value;
                boleta.CedulaEmpleado = comboBoxEmpleado.SelectedItem.ToString();
                boleta.HsTrabajadas = Convert.ToInt32(textBoxCantHoras.Text);
                boleta.Matricula = comboBoxCoche.SelectedItem.ToString();
                boleta.KmEntrada = Convert.ToInt32(textBoxKmsCocheAntes.Text);
                boleta.KmSalida = Convert.ToInt32(textBoxKmsCocheActual.Text);
                boleta.Importe = Convert.ToInt32(textBoxImporte.Text);
                
                if (checkBoxDeposito.Checked)
                    boleta.EsDepositoBancario = true;
                else
                    boleta.EsDepositoBancario = false;
                boleta.Observaciones = textBoxObservaciones.Text;
                
                int i = 0;
                ws.InicializarGastosBoletas();
                foreach (string gasto in listBoxGastosDeLaBoleta.Items)
                {
                    DataGasto nuevoGasto = new DataGasto();
                    nuevoGasto.Nombre = gasto;
                    nuevoGasto.Monto = Convert.ToInt32(listBoxGastoImporte.Items[i]);
                    ws.AgregarGastoBoleta(nuevoGasto);
                    i++;
                }

                if (!ws.ModificarBoleta(boleta))
                {
                    MessageBox.Show("No se ha podido modificar la boleta", "Error al modificar boleta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
                else
                {
                    MessageBox.Show("Se ha modificado la boleta", "Boleta modificada correctamente", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                    Dispose();
                }
            }
        }

        private void textBoxCantHoras_KeyPress(object sender, KeyPressEventArgs e)
        {
            ValidarLetrasNumeros.ControlarNumeros(e);
        }

        private void textBoxKmsCocheActual_KeyPress(object sender, KeyPressEventArgs e)
        {
            ValidarLetrasNumeros.ControlarNumeros(e);
        }

        private void textBoxKmsCocheAntes_KeyPress(object sender, KeyPressEventArgs e)
        {
            ValidarLetrasNumeros.ControlarNumeros(e);
        }

        private void textBoxImporte_KeyPress(object sender, KeyPressEventArgs e)
        {
            ValidarLetrasNumeros.ControlarNumeros(e);
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            ValidarLetrasNumeros.ControlarNumeros(e);
        }

        private void textBoxImporteGasto_KeyPress(object sender, KeyPressEventArgs e)
        {
            ValidarLetrasNumeros.ControlarNumeros(e);
        }

        private void buttonDelete_Click(object sender, EventArgs e)
        {
            
        }

        private void CargarGastosDisponibles()
        {
            EtaxiSoapClient ws = new EtaxiSoapClient();
            DataGasto[] gastos = ws.ListarGastos();

            foreach (DataGasto gasto in gastos)
            {
                this.listBoxGastosDisponibles.Items.Add(gasto.Nombre);
            }
        }

        private void CargarEmpleados()
        {
            EtaxiSoapClient ws = new EtaxiSoapClient();
            DataEmpleado[] empleados = ws.ListarConductores();

            foreach (DataEmpleado empleado in empleados)
            {
                this.comboBoxEmpleado.Items.Add(empleado.Ci);
            }
        }

        private void CargarCoches()
        {
            EtaxiSoapClient ws = new EtaxiSoapClient();
            coches = ws.ListarCoches();

            foreach (DataCoche coche in coches)
            {
                this.comboBoxCoche.Items.Add(coche.Matricula);
            }
        }

        private void CargarDatosBoleta(DataBoleta boleta)
        {
            dateTimePicker1.Value = boleta.FecJornal;
            comboBoxEmpleado.SelectedItem = boleta.CedulaEmpleado;
            textBoxCantHoras.Text = boleta.HsTrabajadas.ToString();
            comboBoxCoche.SelectedItem = boleta.Matricula;
            textBoxKmsCocheAntes.Text = boleta.KmEntrada.ToString();
            textBoxKmsCocheActual.Text = boleta.KmSalida.ToString();
            textBoxImporte.Text = boleta.Importe.ToString();
            if (boleta.EsDepositoBancario)
            {
                checkBoxDeposito.Select();
            }
            textBoxObservaciones.Text = boleta.Observaciones;

            EtaxiSoapClient ws = new EtaxiSoapClient();
            DataGasto[] gastos = ws.ListarGastosBoleta(boleta.Id);
            
            foreach (DataGasto gasto in gastos)
            {
                this.listBoxGastosDeLaBoleta.Items.Add(gasto.Nombre);
                this.listBoxGastoImporte.Items.Add(gasto.Monto);
            }

        }

        private void buttonDown_Click(object sender, EventArgs e)
        {
            if (listBoxGastosDisponibles.SelectedItem != null)
            {
                if (textBoxImporteGasto.Text == "")
                {
                    MessageBox.Show("Ingrese un importe", "Error al agregar gasto", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                }
                else
                {
                    object gasto = listBoxGastosDisponibles.SelectedItem;
                    this.listBoxGastosDeLaBoleta.Items.Add(gasto);
                    this.listBoxGastoImporte.Items.Add(textBoxImporteGasto.Text);
                    this.listBoxGastosDisponibles.Items.Remove(gasto);
                    this.textBoxImporteGasto.Clear();
                }                
            }
            else
            {
                MessageBox.Show("No ha seleccionado ningún gasto", "Error al agregar gasto", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
            }
        }

        private void buttonUp_Click(object sender, EventArgs e)
        {
            if (listBoxGastosDeLaBoleta.SelectedItem != null)
            {
                object gasto = listBoxGastosDeLaBoleta.SelectedItem;
                this.listBoxGastoImporte.Items.RemoveAt(listBoxGastosDeLaBoleta.SelectedIndex);
                this.listBoxGastosDeLaBoleta.Items.Remove(gasto);
                this.listBoxGastosDisponibles.Items.Add(gasto);
            }
            else
            {
                MessageBox.Show("No ha seleccionado ningún gasto", "Error al eliminar gasto", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
            }
            
        }

        private void comboBoxCoche_SelectedIndexChanged(object sender, EventArgs e)
        {
            string matricula = comboBoxCoche.SelectedItem.ToString();

            foreach (DataCoche coche in coches)
            {
                if (matricula == coche.Matricula)
                {
                    textBoxKmsCocheAntes.Text = coche.Kms.ToString();                    
                }
            }
        }

    }
}
